var path = require('path')

// 获取数据库模型
databaseModule = require(path.join(process.cwd(), 'modules/database'))
var logger = require('../modules/logger').logger()

/**
 * 创建对象数据
 *
 * @param  {[type]}   modelName 模型名称
 * @param  {[type]}   obj       模型对象
 * @param  {Function} cb        回调函数
 */
module.exports.create = function (modelName, obj, cb) {
  var db = databaseModule.getDatabase()
  var Model = db.models[modelName]
  Model.create(obj, cb)
}

/**
 * 获取所有数据
 * 
 * @param {[type]} conditions 查询条件
 * 查询条件统一规范
 * conditions
	{
		"columns" : {
			字段条件
			"字段名" : "条件值"
		},
		"offset" : "偏移",
		"omit" : ["字段"],
		"only" : ["需要字段"],
		"limit" : "",
		"order" :[ 
			"字段" , A | Z,
			...
		]
	}
 * @param  {Function} cb 回调函数
 */
module.exports.list = function (modelName, conditions, cb) {
  var db = databaseModule.getDatabase()

  var model = db.models[modelName]

  if (!model) return cb('模型不存在', null)

  if (conditions) {
    if (conditions['columns']) {
      model = model.find(conditions['columns'])
    } else {
      model = model.find()
    }

    if (conditions['offset']) {
      model = model.offset(parseInt(conditions['offset']))
    }

    if (conditions['limit']) {
      model = model.limit(parseInt(conditions['limit']))
    }

    if (conditions['only']) {
      model = model.only(conditions['only'])
    }

    if (conditions['omit']) {
      model = model.omit(conditions['omit'])
    }

    if (conditions['order']) {
      model = model.order(conditions['order'])
    }
  } else {
    model = model.find()
  }

  model.run(function (err, models) {
    if (err) {
      console.log(err)
      return cb('查询失败', null)
    }
    cb(null, models)
  })
}

module.exports.countByConditions = function (modelName, conditions, cb) {
  var db = databaseModule.getDatabase()

  var model = db.models[modelName]

  if (!model) return cb('模型不存在', null)

  var resultCB = function (err, count) {
    if (err) {
      return cb('查询失败', null)
    }
    cb(null, count)
  }

  if (conditions) {
    if (conditions['columns']) {
      model = model.count(conditions['columns'], resultCB)
    } else {
      model = model.count(resultCB)
    }
  } else {
    model = model.count(resultCB)
  }
}

/**
 * 获取一条数据
 * @param  {[type]}   modelName  模型名称
 * @param  {[数组]}   conditions  条件集合
 * @param  {Function} cb         回调函数
 */
module.exports.findOne = function (modelName, conditions, cb) {
  var db = databaseModule.getDatabase()

  var Model = db.models[modelName]

  if (!Model) return cb('模型不存在', null)

  if (!conditions) return cb('条件为空', null)

  Model.one(conditions, function (err, obj) {
    logger.debug(err)
    if (err) {
      return cb('查询失败', null)
    }
    return cb(null, obj)
  })
}

/**
 * 更新对象数据
 *
 * @param  {[type]}   modelName 模型名称
 * @param  {[type]}   id        数据关键ID
 * @param  {[type]}   updateObj 更新对象数据
 * @param  {Function} cb        回调函数
 */
module.exports.update = function (modelName, id, updateObj, cb) {
  var db = databaseModule.getDatabase()
  var Model = db.models[modelName]
  Model.get(id, function (err, obj) {
    if (err) return cb('更新失败', null)
    obj.save(updateObj, cb)
  })
}

/**
 * 通过主键ID获取对象
 * @param  {[type]}   modelName 模型名称
 * @param  {[type]}   id        主键ID
 * @param  {Function} cb        回调函数
 */
module.exports.show = function (modelName, id, cb) {
  var db = databaseModule.getDatabase()
  var Model = db.models[modelName]
  Model.get(id, function (err, obj) {
    cb(err, obj)
  })
}

/**
 * 通过主键ID删除对象
 *
 * @param  {[type]}   modelName 模型名称
 * @param  {[type]}   id        主键ID
 * @param  {Function} cb        回调函数
 */
module.exports.destroy = function (modelName, id, cb) {
  var db = databaseModule.getDatabase()
  var Model = db.models[modelName]
  Model.get(id, function (err, obj) {
    if (err) return cb('无模型ID')
    obj.remove(function (err) {
      if (err) return cb('删除失败')
      return cb(null)
    })
  })
}

/**
 * 通过模型名称获取数据库数量
 *
 * @param  {[type]}   modelName 模型名称
 * @param  {Function} cb        回调函数
 */
module.exports.count = function (modelName, cb) {
  var db = databaseModule.getDatabase()
  var Model = db.models[modelName]
  Model.count(cb)
}

/**
 * 通过条件判断数据是否存在
 *
 * @param  {[type]}   modelName  模块名
 * @param  {[type]}   conditions 条件
 * @param  {Function} cb         回调函数
 */
module.exports.exists = function (modelName, conditions, cb) {
  var db = databaseModule.getDatabase()
  var Model = db.models[modelName]
  Model.exists(conditions, function (err, isExists) {
    if (err) return cb('查询失败')
    cb(null, isExists)
  })
}

module.exports.getModel = function (modelName) {
  var db = databaseModule.getDatabase()
  return db.models[modelName]
}
